package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.CustomException;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.DishDto;
import com.itheima.reggie.entity.DishFlavor;
import com.itheima.reggie.mapper.DishMapper;
import com.itheima.reggie.service.DishFlavorService;
import com.itheima.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Slf4j
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    @Autowired
    private DishFlavorService dishFlavorService;

    @Transactional
    public void saveWithFlavor(DishDto dishDto){
        log.info("[保存菜品，dto:{}]",dishDto);
        // 完成菜品基本信息的保存﹐通过MP框架﹐把数据写入到表中
        // insert into dish ( values ( 2222222)
        this.save(dishDto);
        // 保存完成后，自动返回菜品Id
        Long dishId = dishDto.getId();
        log.info("[保存菜品]，dishId:{}",dishId);
        // 遍历口味列表，把菜品Id放进去
        List<DishFlavor> flavors = dishDto.getFlavors();
        for (DishFlavor dishFlavor:dishDto.getFlavors()){
            dishFlavor.setDishId(dishId);
            // dishFlavorService.save(dishFlavor); //保存1次，连接次（不可取）
        }
        log.info("[保存菜品]，flavors:{}",flavors);
        // 批量保存
        dishFlavorService.saveBatch(flavors);
    }

    @Override
    public DishDto getByIdWithFlavor(Long id) {
        // 根据菜品ID，获取菜品对象
        Dish dish = this.getById(id);
        if (dish == null){
            throw new CustomException("菜品没有找到哦！！！");
        }
        // 现在我们要的dishDto,但我们的数据在Dish,怎么办？
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(dish,dishDto);
        // dishDto只有菜品的基本信息，是不是没有口味列表
        // 接下来，使用菜品口味的Service,获取菜品口味列表，条件是？根据菜品的Id
        LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(DishFlavor::getDishId,dish.getId());
        List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
        // 获取到菜品口味，赋值给Dto
        dishDto.setFlavors(dishFlavorList);
        return dishDto;
    }

    // 当前业务方法，涉及多个Dao操作
    @Override
    @Transactional
    public void updateWithFlavor(DishDto dishDto) {
        // 完成菜品及菜品口味的更新
        // 思路：先更新菜品基本信息，然后再更新口味列表信息
        // 更新菜品基本信息
        this.updateById(dishDto);
        // 更新口味列表信息，这个地方如何更新？
        //  最好的做法：经验之谈
        // 根据菜品ID，把之前的口味全部删除
        // delete from dish_flavor where dish_id = 9828 2条删除
        LambdaQueryWrapper<DishFlavor> dishFlavorLambdaQueryWrapper = new LambdaQueryWrapper<>();
        dishFlavorLambdaQueryWrapper.eq(DishFlavor::getDishId,dishDto.getId());
        dishFlavorService.remove(dishFlavorLambdaQueryWrapper);

        // 在口味列表，重新插入
        // 遍历请求的口味列表，把菜品的ID赋值进去
        List<DishFlavor> flavors = dishDto.getFlavors();
        for (DishFlavor dishFlavor : flavors) {
            dishFlavor.setDishId(dishDto.getId());
        }
        // dishFlavor还是原来的Id
        // 批量保存口味列表
        dishFlavorService.saveBatch(flavors);
    }
}
